// 2-1 引用-引用与指针的区别

/**
 * C++ 引用
 * 引用变量是一个别名，也就是说，它是某个已存在变量的另一个名字。一旦把引用初始化为某个变量，就可以使用该引用名称或变量名称来指向变量。
 * 
 * ----------------
 * C++ 引用 vs 指针
 * 引用很容易与指针混淆，它们之间有三个主要的不同：
 * 1. 不存在空引用。引用必须连接到一块合法的内存。
 * 2. 一旦引用被初始化为一个对象，就不能被指向到另一个对象。指针可以在任何时候指向到另一个对象。
 * 3. 引用必须在创建时被初始化。指针可以在任何时间被初始化。
*/
#include <iostream>

int main(void)
{
  int a = 1;
  int c = 2;
  // int &b; // error: 'b' declared as reference but not initialized 引用 变量 "b" 需要初始值设定项
  // int &b = NULL;// error: cannot bind non-const lvalue reference of type 'int&' to an rvalue of type 'int'

  // int *ptr = NULL;

  int &b = a;
  std::cout << "b : " << b << std::endl; // 1
  b = c;
  std::cout << "b : " << b << std::endl; // 2
  std::cout << "a : " << a << std::endl; // 2
  a = 3;
  std::cout << "b : " << b << std::endl; // 3
  struct test
  {
    int num;
  } t1;

  test &t = t1;
  t1.num = 1;
  std::cout << "t.num : " << t.num << std::endl;

  test t2;
  t2.num = 2;
  t = t2;
  std::cout << "t.num : " << t.num << std::endl;

  std::cout << "t1.num : " << t1.num << std::endl;

  printf("-----------end---------------\n");
  return 0;
}